<?php
    /***********************
     * MooPHP 核心控制程序
     * 该程序仅支持PHP5.0以上版本，如果你的服务器使用的是5.0以下版本,
     * 请升级为5.0以上版本。
     * 该程序在遵循GPL公开协议的前提下开源，但是请勿修改程序__core目录
     * 下的任何代码，以免造成程序崩溃。
     * 请勿修改版权信息，以及作者。
     * @Author:Tom Chen
     * @Create Date:4/17/2011 00:59:26
     * @Version: V1.0.0.1
     * @Subversion Version: 1
     * @CopyRight (C) Tom Chen
     ***********************/
    /**
     * 载入框架初始化定义.
     **/
    include_once("init_defined.php");
    
    /**
     * 自动加载核心框架类。
     **/
    function __autoload($className){
        $classFile  =  M_DIR.DS."__core".DS.$className.".class.php";  
        if(file_exists($classFile))
            include_once $classFile;
    }
    
    /**************************
     * 
     *
     *
     *
     *************************/
class M{
        /**
         * 注册的对象列表.
         **/
        private $_Objects   = array();

        public function __construct(){
            
        } 

        public function __set($key, $val){
            
        }

        public function __get($key){
        
        }
        
        /**
         * 魔法方法,调用本身方法,或者调用其他类方法,或者调用其他类.
         * @parmas string $name 方法或者类名.
         * @parmas array $parmas 参数数组.
         * @return obejct;
         **/
        public function __call($name, $parmas){
            if(isset($this -> _Objects[$name]) && is_object($this -> _Obejcts[$name]))
                return $this -> _Objects[$name];
            else{
                $path =   $this -> breakClassPath($name);
                if(count($parmas)>0){
                    if(is_dir($parmas[0])){
                        $classFile  = sprintf("%s%s.class.php", substr($parmas[0], -1) == DS?$parmas[0]:$parmas[0].DS, $path);
                        if(file_exists($classFile)){
                            include_once($classFile);
                            if(count($parmas) == 1)
                                $this -> _Objects[$name]    = new $name;
                            else{
                                $this -> _Objects[$name]    = new $name();
                            }
                            return $this -> _Objects[$name];
                        }
                    }
                    else
                        return $this -> $name($parmas);
                    
                }
                else{
                    if(file_exists(M_DIR.DS.$path.".class.php")){
                        include_once(M_DIR.DS.$path.".class.php");
                        $this -> _Objects[$name]    = new $name;
                        return $this -> _Objects[$name];
                    }
                    /*else{
                       return $this -> $name(); 
                    }*/
                }
            }
        }
        
        /**
         * 坼解类所在路径。
         * @Parmas string $path路径(既是调用的函数的第一层名称)
         * @return boolean/String;
         **/
        private function breakClassPath($path){
            if(empty($path))
                return false;

            $pathArr    = explode("_", $path);
            if(count($pathArr)>1){
                $_p     = "";
                foreach($pathArr as $val)
                    $_p     .= $val.DS;

                return substr($_p, 0, -1);
            }
            else
                return $path;
        }
        
        /**
         * 载入某个文件.
         * @parmas String/Array $f 载入的文件.
         * @return object/array of object.
         **/
        public function __load($f){
            
        }
        
        /**
         * 显示获取ini文件内容
         * @parmas String $iniName ini文件的名称.
         * @parmas String $iniPath ini文件的路径.
         * @parmas String $iniKey ini键值.
         * @return String/Array;
         **/
        public function ini($iniName, $iniPath, $iniKey=null){
            if(!empty($iniName) && !empty($iniPath)){
                    $iniFile    = $iniPath.DS.$iniName.".ini";
                    if(file_exists($iniFile) && is_readable($iniFile))
                        return M::iniParmas($this -> MFile() -> read($iniFile));
                    else
                        throw new MException("载入ini失败.", "ERR_INI_LOAD", "_LOG_");
            }
        }

        public static function iniParmas($contents){
           return $contents; 
        }
        
        /**
         * 框架启动方法
         * @return null;
         **/
        public function run(){
            echo $this -> MFile() -> read(APP -> config['app_config'].DS."config.ini");
        }
        
        /**
         * 返回框架的版本.
         * @return String;
         **/
        public static function version(){
            echo "1.0.0.0-build 0006";
        } 

        public function __toString(){
            return $this;
        }
    }

    try{
        $M  = new M;
        if(is_object($M))
            return $M;
        throw new MException("载入框架失败.");
    }
    catch(MException $e){
        $e -> getMsg();
    }
?>
